﻿using S7.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace SimS7Study
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 连接第三方库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {

            // 机架号 标识plc系统中的主框架(安装有CPU的机架就是主框架,主框架的机架号就是0)或扩展框架(其他扩展框架，如果有多个从1开始依次往后推)。
            // 槽口号 分配CPU模块、电源模块、IO信号模块、通信模块等的具体位置。槽号确定的是设备的唯一性,确保每个模块在机架号的位置明确。
            Plc plc = new Plc(CpuType.S71500, "192.168.109.30", 0, 0);

            plc.Open();



        }

        /// <summary>
        /// 手搓协议
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
            #region 三次握手
            socket.Connect("192.168.109.30", 102);
            #endregion

            #region COTP连接

            byte[] bytes = [
                 #region TPKT
                0x03,//版本号
                0x00,//保留

                0x00,//长度
                0x16,
                  #endregion

                #region COTP
                0x11,//该字节之后的所有字节数
                0xe0,//PDU类型   附录一

                0x00,//目标引用
                0x00,

                0x00,//源引用
                0x01,

                0x00,//扩展格式

                0xc1,
                0x02,//原tsap长度
                0x01,//源连接模式。附录二
                0x00,//机架号 槽口号

                0xc2,
                0x02,
                0x03,//机架号
                0x00,//槽号

                0xc0,
                0x01,
                0x0a//2的10次方
	            #endregion
            ];

            socket.Send(bytes);
            #endregion

            #region setup communication的报文
            bytes = [
                #region TPKT
                 0x03,//版本号
                0x00,//保留

                0x00,//长度
                0x19,
                #endregion

                #region COTP
                    0x02,//当前cotp后面的字节数
                    0xf0,//pdu类型
                    0x80,//固定
                #endregion

                #region S7 Communication-header
                    0x32,//协议ID 固定

                    0x01,//远程操作命令 附录三

                    0x00,//预留
                    0x00,

                    0xff,// 协议单元事件引用 累加
                    0xff,

                    0x00,//参数长度
                    0x08,

                    0x00,//数据长度
                    0x00,
                #endregion

                #region  S7 Communication-parameter
                    0xf0,//功能码。通信功能是f0。附录四
                    0x00,//预留

                    0x00,//amq(calling)
                    0x03,

                    0x00,//amq(called)
                    0x03,

                    0x03,//pdu长度
                    0xc0
               #endregion
            ];
            #endregion

            socket.Send(bytes);
        }
    }
}